#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdarg.h>

// 获取文件大小（以字节计）
long getFileSize(FILE *fp) {
    if (fp == NULL) return -1; // 错误处理
    long fsize;
    fseek(fp, 0, SEEK_END); // 移动到文件末尾
    fsize = ftell(fp); // 获取当前位置（即文件大小）
    fseek(fp, 0, SEEK_SET); // 重新移动到文件开头
    return fsize;
}

// 文件复制函数
long fcopy(FILE *fSource, long offsetSource, long len, FILE *fTarget, long offsetTarget) {
    if (fSource == NULL || fTarget == NULL) return -1; // 错误处理

    fseek(fSource, offsetSource, SEEK_SET);
    fseek(fTarget, offsetTarget, SEEK_SET);
    
    char *buffer = (char *)malloc(len);
    if (buffer == NULL) return -1; // 内存分配失败

    size_t bytesRead = fread(buffer, 1, len, fSource);
    size_t bytesWritten = fwrite(buffer, 1, bytesRead, fTarget);

    free(buffer);
    return bytesWritten; // 返回复制的字节数
}

// 向文件中插入内容
int finsert(FILE *fp, long offset, void *buffer, int len) {
    if (fp == NULL || buffer == NULL || len <= 0) return -1; // 错误处理
    
    // 获取文件大小
    long fileSize = getFileSize(fp);
    if (fileSize < 0) return -1;

    // 移动到插入位置
    fseek(fp, offset, SEEK_SET);

    // 读取原有数据
    char *originalData = (char *)malloc(fileSize - offset);
    if (originalData == NULL) return -1; // 内存分配失败

    fread(originalData, 1, fileSize - offset, fp);

    // 移动到插入位置并写入新数据
    fseek(fp, offset, SEEK_SET);
    fwrite(buffer, 1, len, fp);

    // 写入原有数据
    fwrite(originalData, 1, fileSize - offset, fp);

    free(originalData);
    return 0; // 成功
}

// 从文件中删除内容
int fdelete(FILE *fp, long offset, int len) {
    if (fp == NULL || len <= 0) return -1; // 错误处理

    // 获取文件大小
    long fileSize = getFileSize(fp);
    if (fileSize < 0) return -1;

    // 移动到删除位置
    fseek(fp, offset + len, SEEK_SET);

    // 读取剩余数据
    char *remainingData = (char *)malloc(fileSize - offset - len);
    if (remainingData == NULL) return -1; // 内存分配失败

    fread(remainingData, 1, fileSize - offset - len, fp);

    // 移动到删除位置并写入剩余数据
    fseek(fp, offset, SEEK_SET);
    fwrite(remainingData, 1, fileSize - offset - len, fp);

    // 截断文件
    _chsize(_fileno(fp), fileSize - len);

    free(remainingData);
    return 0; // 成功
}

// 暂停程序
void pause(const char *str, ...) {
    va_list vl;
    char buf[500] = {0};
    va_start(vl, str);
    vsnprintf(buf, sizeof(buf), str, vl);
    va_end(vl);
    printf("%s", buf);
    getch();
    printf("\n");
}

// 测试代码
int main() {
    FILE *fp = fopen("test.txt", "wb+");
    if (!fp) {
        perror("无法打开文件");
        return 1;
    }

    // 写入测试数据
    const char *data = "Hello, World!";
    fwrite(data, 1, strlen(data), fp);
    fflush(fp);

    // 测试获取文件大小
    long size = getFileSize(fp);
    printf("文件大小: %ld\n", size);

    // 测试文件复制
    FILE *fpCopy = fopen("copy.txt", "wb+");
    fcopy(fp, 0, size, fpCopy, 0);
    fclose(fpCopy);

    // 测试插入数据
    const char *insertData = " Inserted Text";
    finsert(fp, 7, (void *)insertData, strlen(insertData));

    // 测试删除数据
    fdelete(fp, 5, 7); // 删除 ", Wor"

    // 读取并打印文件内容
    fseek(fp, 0, SEEK_SET);
    char buffer[100];
    fread(buffer, 1, 100, fp);
    printf("文件内容: %s\n", buffer);

    fclose(fp);
    pause("操作完成，按任意键继续...");
    return 0;
}
